package src.algorithm;

import java.util.*;

/**
 *  题目：小明买东西不喜欢付款的价格中有不幸运数字（比如；1，3，5，7），所以都会多付钱，但是不喜欢出现数字0，去除不幸运数字后付最少的钱，比如
 *  一次买东西需付款：4259，去除不幸运数字后最少付款：4262
 *  计算小明买东西应该付多少钱（支持数字从1-999999）
 *  解决思路：判断数字是幸运数字还是不幸运数字，如果第一位，比如3259的第一位3不是幸运数字，则遵循最小原则，匹配一个最后小于4的幸运数字，比如
 *  幸运数字有：2，4，6，8，9，则6是大于4对应最小的幸运数字。而当第一位就不是幸运数字，遵循最小原则，接下的其他数字，只需要取最小的幸运数字即
 *  可。所以得出 4222。
 *
 */
public class LuckyNumber
{
    Map<String,String> TagMap = new HashMap<>();//记录幸运数字的位置和标识，一个是数字index，第二个是tag，0-不是幸运数字，1-是幸运数字

    public static void main(String[] args)
    {
        LuckyNumber luckyNumber = new LuckyNumber();
        InitNumbers numbers = new InitNumbers();
        Scanner scanner = new Scanner(System.in);
        String str1 = scanner.next();
        List<Integer> numberList = numbers.numbers;
        List<Integer> unLuckyNum = new  ArrayList();
        unLuckyNum.add(1);
        unLuckyNum.add(3);
        unLuckyNum.add(7);
        unLuckyNum.add(5);
        System.out.println("\n"+"需付款："+str1+"，该付："+luckyNumber.luckyNumberProcess(unLuckyNum, Integer.valueOf(str1)));
    }

    public void printNum(List<Integer> numberList,String tag){
        System.out.print(tag+":");
        for (int num:numberList) {
            System.out.print(num+",");
        }
    }

    public String luckyNumberProcess(List<Integer> unLuckyNum,int payNum)
    {
        LuckyNumber luckyNumber = new LuckyNumber();
        luckyNumber.printNum(unLuckyNum,"不幸运数字");
        int luckyNum = 0;
        //去除不幸运数字，剩下幸运数字
        List<Integer> luckyNumList = InitNumbers.deleteUnluckyNumber(unLuckyNum);
        luckyNumber.printNum(luckyNumList,"幸运数字");
        String payNumStr = (String.valueOf(payNum));
        char[] ss = payNumStr.toCharArray();
        List<Integer> finalyLuckyNum = new ArrayList();
        for(int i=0;i<ss.length;i++)
        	finalyLuckyNum.add(luckyNumber.getPayInt(ss[i],luckyNumList,String.valueOf(i)));
        String finalyLuckyNumStr = "";
        for (int num: finalyLuckyNum)
            finalyLuckyNumStr += String.valueOf(num);
        return finalyLuckyNumStr;
    }

    /**
     * 主要处理逻辑
     * 先判断最大的数是否是幸运数字，是：TagMap记录当前的tag-1为是幸运数字
     * 不是；取比这个数大的最小幸运数字，并记录tag-0为是不幸运数字
     */

    public int getPayInt(char payNumChar,List<Integer> luckyNumList,String i){
        int temp = Integer.valueOf(payNumChar) -48;
        if(TagMap.get("0") == "0")
            return luckyNumList.get(0);
        if(TagMap.get("1") == "0")
            return luckyNumList.get(0);
        if(TagMap.get("2") == "0")
            return luckyNumList.get(0);
        if(TagMap.get("3") == "0")
            return luckyNumList.get(0);
        if(TagMap.get("4") == "0")
            return luckyNumList.get(0);
        //如果是幸运数字，返回
        int tempNum = 1;
    	for (int num: luckyNumList)
        {
            tempNum = num;
            if(num == temp)
            {
                TagMap.put(i,"1");
                return num;
            }
        }
    	//不是幸运数字，比较返回第一个比temp大的幸运数字
        for (int num: luckyNumList)
        {
            tempNum = num;
            if(num > temp){
                TagMap.put(i,"0");
                return num;
            }
        }

        for (int num: luckyNumList)
        {
            TagMap.put(i,"0");
            return 11;
        }
        return tempNum;
    };

}

class InitNumbers{
    static public List<Integer> numbers = new ArrayList();
    public InitNumbers()
    {
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.add(4);
        numbers.add(5);
        numbers.add(6);
        numbers.add(7);
        numbers.add(8);
        numbers.add(9);
    }

    /**
     * 去除不幸运数字
     * @param unLuckyNumList
     * @return
     */
    static public List<Integer> deleteUnluckyNumber(List<Integer> unLuckyNumList )
    {
        for (int num: unLuckyNumList)
            numbers.remove((Object)num);
        return numbers;
    }
}